module aes_top(
    input clk,
    input rst_n,
    input load,
    input [4:0]CMD,// wrpckreg       keyexp      staenc     stadec
                   //    4 (16)       3(8)        2(4)      1 (2) 
    output  keyexprdy,// 密钥扩展状态
    output  encdecrdy, // 加解密状态

    // data_path
    input [127:0]intxt,
    // input [127:0]key,
    output [127:0]outtxt
);

    wire   wrregen;        
    wire   mixsel;
    wire   reginsel;
    wire   en_de_sel;
    wire   keysel;
    wire   rcon_en;
    wire   rd_en_keyexp_regs;
    wire   wr_en_keyexp_regs;
    wire   wr_en_share_reg;

    wire [1:0] keyadsel;
    wire [3:0]exp_addr;
    wire [127:0]share_reg_out;
    wire [127:0]exp_key;
    //reg temp_probe;
    EnorDecode  u_EnorDecode (
        .clk                     ( clk        ),//
        .wrregen                 ( wrregen    ),//
        .mixsel                  ( mixsel     ),//
        .reginsel                ( reginsel   ),//
        .en_de                   ( en_de_sel),//temp_probe  ),// 
        .keyadsel                ( keyadsel   ),//

        // data_path
        .intxt                   ( share_reg_out),//
        .roundkey                ( exp_key   ),// 
        .outtxt                  ( outtxt     ) // 
    );

    keyexp  u_keyexp (
        .clk                     ( clk                 ),//
        .rst_n                   ( rst_n               ),//
        .keysel                  ( keysel              ),//
        .rd_en_keyexp_regs       ( rd_en_keyexp_regs   ),//
        .wr_en_keyexp_regs       ( wr_en_keyexp_regs   ),//
        .addr                    ( exp_addr            ),//
        .rcon_en                 ( rcon_en             ),//

        // data_path
        .key                     ( share_reg_out   ),//
        .exp_key                 ( exp_key         )//
    );

    aescontrol  u_aescontrol (
        .clk                     ( clk         ),//
        .rst_n                   ( rst_n      ),//
        .load                    ( load        ),//
        .CMD                     ( CMD         ),//

        .en_de_sel               ( en_de_sel   ),//
        .keyexprdy               ( keyexprdy   ),// 
        .encdecrdy               ( encdecrdy   ),// 
        .keysel                  ( keysel      ),//
        .rndkren                 ( rd_en_keyexp_regs     ),//
        .wrrndkrf                ( wr_en_keyexp_regs    ),//
        .krfaddr                 ( exp_addr    ),//
        .rconen                  ( rcon_en     ),//
        .keyadsel                ( keyadsel    ),//
        .mixsel                  ( mixsel      ),//
        .reginsel                ( reginsel    ),//
        .wrregen                 ( wrregen     ),//
        .wrpckreg                ( wr_en_share_reg    )//
    );

    reg_128 reg_128_share(
        .clk                     ( clk     ),//
       // .rst_n                   ( rst_n   ),//
        .write                   ( wr_en_share_reg   ),//
        
        // data_path
        .din                     ( intxt            ),//
        .dout                    ( share_reg_out    )//
    );
endmodule